Hello!大家好,最近在做Google Code Jam
的過程中,不小心迷上了解題的過程XD,所以我又分心去多找了一些關於解演算法的題目網站,於是登愣「就被我找到啦!」如果各位對邏輯思考,然後喜歡燃燒大腦的都可以試著解一些題目,他是有難易度的,所以可以從簡單先下手,而且他也有一些關於資料庫SQL的題目,也滿有難度的(對我而言啦XD),所以我打算把這個過程開一個系列,讓我記錄下每次解題的過程,然後我PO上來的難度都會選在中以上,簡單的我就不在PO上來獻醜了,那今天就開始第一篇這個系列吧!
題目名稱:Longest Substring Without Repeating Characters
難易度:中
題目內容:輸入一個字串,然後找出這個字串中最長,而且又沒有重複的子字串,並回傳他的長度。
例如:
1.輸入abcabcbb
,該字串中最長又沒有重複字母的子字串就是abc
,然後回傳他的長度,答案是3。
2.輸入bbbbbb
,該字串中最長又沒有重複字母的子字串就是b
,然後回傳他的長度,答案是1。
3.輸入pwwkew
,該字串中最長又沒有重複字母的子字串就是wke
,然後回傳他的長度,答案是3。
那以下開始動工:
//這個function名稱是網站預設的
var lengthOfLongestSubstring = function(s) {
//宣告一個陣列,用來裝不重複的字元。
let arr = [];
//宣告要回傳的變數,用來裝不重複的字元的字串長度
let maxLen = 0;
//首先跑迴圈,把每個字元都看過
for(let i=0; i<s.length; i++){
//先比較現在這個字母有沒有在陣列中
if(arr.indexOf(s[i]) !== -1){
/*如果有的話,因為重複了,所以把從該位置之前的字元都從陣列中拿掉
陣列中保持著在該字串中連續,且不重複的字元*/
arr = arr.slice(arr.indexOf(s[i])+1);
};
//經過判斷後把目前這個字元加進陣列中
arr.push(s[i]);
//如果目前陣列的長度,大於目前要回傳的最大長度,就把要回傳的最大長度更新
if(maxLen < arr.length){
maxLen = arr.length;
}
};
//最後回傳
return maxLen;
};
當然因為只是解題方式,所以我的絕對不會是唯一,而且最佳的解,如果大家看到我的程式碼有任何想法都歡迎告訴我,或是也可以交流看看有沒有更好,而且我沒有想到的方式,畢竟演算法好玩的地方在大家的想法不同,程式碼也會長的不一樣XD,好的那第一篇分享解題就到這裡,謝謝大家!
這題和 Code Jam 第一題一樣,也是貪婪法邏輯,
在跑迴圈時,每次都保持陣列內字串不重複,並記錄陣列的最大值,
迴圈跑完後 maxLen 就是最大子字串長度。
大大要開系列文了,期待 SQL 的題目,哈哈哈
其實它同時也記了最大的子字串,
只不過沒有回傳而已。
哈哈,因為之前都沒有認真和演算法相處(應該可以說根本沒有XD),
所以我對一些解題的方法超級陌生,
像我第一次看見貪婪法就是在大大的文章中XD
ㄛ但是我不確定這一系列文能不能算技術文章,哈哈哈
回小魚大大
應該沒有紀錄最大子字串,只記錄了最大長度,
arr 有可能會變短。
回神Q超人大大
分享解題心得很不錯阿,哈哈哈
可能工作是寫 Web 的關係,
離開學校後就很少有機會接觸演算法了呢
好像是這樣沒錯,
之前是我誤會了,
不過只要多一個變數就可以記錄了。
小魚對,哈哈,但是他只要遇到重複的字就會截掉前面的子字串了,所以跑到最後陣列裡也不一定是最長的子字串,不過就像大大說的,在一個變數就可以搞定XD
fysh711426哈哈哈,我也是寫web啊,只是因為是在寫系統,所以可能還是有一些邏輯要處理吧。
話說,
現在在業界除非你不用套件,
用C++或Java慢慢寫,
要不然演算法人家都幫你寫好了,
除非是要寫那種比較專業需要自己寫演算法的,
現在很少人在寫演算法了,
只有學校或做研究的有在寫而已。
而且為了省開發的時間,
基本上不大會去寫演算法了。
對阿,大大說到重點,為了省開發的時間
,
很多時候為了要快點完成專案,效能架構什麼都是其次了,
只要最後程式能跑就好,覺得蠻可惜的。
ㄛ這是真的欸,現在太多太方便的套件,
導致大家再學的都是套件的使用方式,反而不是語言本身了,
有時候在讀JS朋友也會說讀那麼深幹嘛
耶耶!學到了 我會一天比一天強 總有一天會超越你的 神Q超人大師!
哈哈哈,我還不是大師,不過我們可以一起變強XD